<?php

namespace app\adminapi\controller;

use app\adminapi\logic\AuthLogic;
use Exception;
use think\Controller;
use tools\jwt\Token;

class BaseApi extends Controller
{

    //无需进行登录检测的请求
    protected $no_login = ['login/login', 'login/captcha'];

    /**
     * 初始化方法，用于设置跨域请求的响应头
     * 该方法在控制器的每个操作执行前调用，确保所有响应都包含跨域配置
     */
    protected function _initialize()
    {
        // 调用父类的初始化方法，确保基础初始化逻辑得以执行
        parent::_initialize();

        // 设置跨域访问的域名，"*"表示允许所有域名
        header("Access-Control-Allow-Origin: *");

        // 设置允许访问的请求头，包括Origin, X-Requested-With, Content-Type, Accept, Authorization
        header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");

        // 设置允许访问的请求方法，包括GET, POST, PUT, DELETE, OPTIONS
        header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");

        //尝试执行登录验证和用户ID设置
        try {
            //生成当前请求路径
            $path = strtolower($this->request->controller()) . '/' . $this->request->action();
            //检查当前请求路径是否需要登录验证
            if (!in_array($path, $this->no_login)) {
                //获取用户ID
//                $user_id = Token::getUserId();
                $user_id = 1; //TODO 测试用
                //登录验证
                if (empty($user_id)) {
                    //如果用户ID为空，表示未登录或Token无效，返回错误信息
                    $this->fail('未登录或Token无效', 403);
                }
                //将获取的用户id 设置到请求信息中
                $this->request->get(['user_id' => $user_id]);
                $this->request->post(['user_id' => $user_id]);
                //检查用户权限
                $authCheck = AuthLogic::check();
                if (!$authCheck) {
                    $this->fail('权限不足', 403);
                }
            }
        } catch (Exception $e) {
            //如果发生异常，表示Token验证等过程出现问题，返回错误信息
            $this->fail('服务异常，请检查token令牌', 403);
        }
    }

    /**
     * 构建并发送HTTP响应
     *
     * 该方法用于生成一个统一格式的HTTP响应，包括状态码、消息和可选的数据部分
     * 它主要用于简化响应构建过程，确保响应格式的一致性
     *
     * @param int $code HTTP状态码，默认为200，表示请求成功
     * @param string $msg 响应消息，默认为'success'，用于描述响应结果
     * @param array $data 响应数据，默认为空数组，用于携带响应的具体数据内容
     */
    public function response($code = 200, $msg = 'success', $data = [])
    {
        // 创建一个数组，包含响应的所有部分：状态码、消息和数据
        $res = [
            'code' => $code,
            'msg' => $msg,
            'data' => $data
        ];

        // 将响应数组转换为JSON格式并发送
        json($res)->send();die;
    }

    /**
     * 生成成功的HTTP响应
     *
     * 该方法用于当API请求成功时，返回给用户成功的信息、可选的数据以及HTTP状态码
     * 它封装了response方法，为开发者提供了一个更简洁的接口来处理成功的响应
     *
     * @param array $data 可选的响应数据，默认为空数组
     * @param string $msg 响应信息，默认为'success'
     * @param int $code HTTP状态码，默认为200表示请求成功
     */
    public function ok($data = [], $msg = 'success', $code = 200)
    {
        $this->response($code, $msg, $data);
    }

    /**
     * 生成失败响应
     *
     * 该方法用于当API请求失败时，返回一个带有错误信息和状态码的响应
     * 它允许通过参数自定义错误消息和HTTP状态码，默认状态码为500，表示服务器内部错误
     *
     * @param string $msg 错误消息，默认为'fail'
     * @param int $code HTTP状态码，默认为500
     */
    public function fail($msg = 'fail', $code = 500)
    {
        $this->response($code, $msg);
    }
}
